perm filename SORCE.SAI[PUB,TES]1 blob sn#129308 filedate 1974-11-03 generic text, type T, neo UTF8
00100	BEGOF("SORCE")
00200	
00300	COMMENT
00400	
00500	                *** Variations at Different Sites ***
00600	
00700	SWICHFILE has to ignore the directory page on TV files at SU-AI.
00800	SORCE! differentiates file naming at TENEX sites. SORCE! also
00900	has an optional feature presently enabled only at PARC: if there is a
01000	file named MYPUB.DFS in the user directory, it is automatically
01100	REQUIREd after PUBSTD.DFS.
01200	
01300	                                 ***

01400	
01500	Source switching and scanning module.  The principal data structure
01600	is INPUTSTR, the current string being scanned.  RD scans it and also
01700	replenishes it when exhausted. The INEST and SNEST arrays remember
01800	sources that have been pushed down due to macro calls, REQUIRE
01900	SOURCE!FILE, etc.
02000	
02100	;
02200	
02300	PROCEDURES
     

00100	PUBLIC SIMPLE PROCEDURE SORCE! ;$"#
00200	BEGIN "SORCE!"
00300	
00400	INPUTCHAN ← -1 ;
00500	INPUTSTR ← CRLF & "99999/99" & TB & TB &
00600	    "<<)]"&RCBRAK&"⊃>>;END""PAST EOF"";END""PASSED EOF"";" ;
00700	
00800	S ← TEXT!BRC ← CRLF & ALTMODE & RUBOUT & VT & " -.!?" ;
00900	WHILE FULSTR(S) DO DPB(LDB(SPCHAR(J ← LOP(S))), SPCODE(J)) ;
01000	
01100	DEFN!BRC ← RCBRAK&"$)⊂⊃∃" & LF & LETTS ;
01200	LDEFN!BRC ← LENGTH(DEFN!BRC) ;
01300	
01400	SETBREAK(TO!VT!SKIP,	VT,		NULL,		"IS") ;
01500	SETBREAK(TO!COMMA!RPAR,	",)" & LF,	CR,		"IR") ;
01600	SETBREAK(TO!TERQ!CR,	RCBRAK&";),]⊂"&CRLF,	NULL,	"IR") ;
01700	SETBREAK(TO!SEMI!SKIP,	";"&RCBRAK&""&LF,	NULL,	"IS") ;
01800	SETBREAK(NO!CHARS,	NULL,		NULL,		"XRL");
01900	SETBREAK(ONE!CHAR,	NULL,		NULL,		"XA") ;
02000	SETBREAK(TO!TB!FF!SKIP,	TB&FF,		LF,		"IS") ;
02100	SETBREAK(TO!LF!TB!VT!SKIP, LF&TB&VT,	FF,		"ISL");
02200	SETBREAK(TO!VISIBLE,	SP&CR,		NULL,		"XR") ;
02300	SETBREAK(ALPHA,		LETTS&DIGS,	NULL,		"XR") ;
02400	SETBREAK(DIGITA,	DIGS,		NULL,		"XR") ;
02500	SETBREAK(TO!QUOTE!APPD,	""""&LF,	NULL,		"IA") ;
02600	SETBREAK(TO!NON!SP,	SP,		NULL,		"XR") ;
02700	SETBREAK(TEXT!TBL,	TEXT!BRC&SIG!BRC,NULL,		"IS") ;
02800	SETBREAK(TO!VBAR!SKIP,	"|"&LF,		CR,		"IS") ;
02900	SETBREAK(DEFN!TABLE,	DEFN!BRC,	NULL,		"IS") ;
03000	SETBREAK(TO!CR!SKIP,	CRLF,		NULL,		"IS") ;
03100	
03200	SWICH(CRLF & "9999/98" & TB & TB &
03300	    "CLOSE TEXT;AFTER TEXT⊂⊃;NEXT PAGE;END ""!MANUSCRIPT"" ",
03400		-1, 0) ;
03500	SWICHFILE(INFILE, INCHAN) ; comment main input file ;
03600	
03700	IFC PARCVER OR ISIVER THENC		RT01 10/25/74;
03800	BEGIN TES 1/22/74 OPTIONAL MYPUB.DFS ON USER DIRECTORY ;
03900	INTEGER CHAN ; EOF ← 0 ; CHAN ← GETCHAN ;
04000	OPEN(CHAN, "DSK", 0, 2, 0, 150, BRC, EOF) ;
04100	LOOKUP(CHAN, "MYPUB"&DFSEXT, FLAG) ;
04200	IF FLAG THEN RELEASE(CHAN)
04300	ELSE SWICHFILE("MYPUB"&DFSEXT,CHAN) ;
04400	END ;
04500	ENDC TES 1/22/74 ;
04600	
04700	SWICH("BEGIN ""!MANUSCRIPT"" ", -1, 0) ;
04800	
04900	PUBSTD ← TRUE ; COMMENT SUPPRESS PAGE NUMBER MONITORING ;
05000	IFC TENEX THENC
05100	SWICHF(LIBPPN & "PUBSTD"&DFSEXT) ;
05200	ELSEC
05300	SWICHF("PUBSTD"&DFSEXT&LIBPPN) ; comment standard modes and macros ;
05400	ENDC
05500	
05600	END "SORCE!" ;
     

00100	PUBLIC SIMPLE PROCEDURE BURPINPUT(BOOLEAN VERBOSE) ;$"#
00200	BEGIN
00300	INTEGER L; STRING SL ;
00400	OUTSTR("LINE/PAGE "&ERRLINE&"/"&SRCPAGE&TB&
00500		SOMEINPUT[1 TO (IF VERBOSE THEN 300 ELSE 60)] ) ;
00600	OUTSTR(CRLF&" - - - - - - - - - - - - - - - - - - - -"&CRLF) ;
00700	FOR L ← LAST STEP -2 UNTIL (IF VERBOSE THEN 6 ELSE 6 MAX LAST-6) DO
00800		BEGIN
00900		SL ← LINESCAN(L) ;
01000		IF CHANSCAN(L) GEQ 0 THEN  OUTSTR(SCAN(SL,TO!VT!SKIP,DUMMY)) ;
01100		OUTSTR(SP & SL & "/" & CVS(LH(DUMMY←ABS(PAGESCAN(L)))) & TB) ;
01200		OUTSTR(STRSCAN(L)[1 TO (IF VERBOSE THEN 300 ELSE 60)]) ;
01300		OUTSTR(CRLF&" - - - - - - - - - - - - - - - - - - - -"&CRLF) ;
01400		END ;
01500	END "BURPINPUT" ;
     

00100	PUBLIC SIMPLE PROCEDURE DREQUIRE ;$"#
00200	BEGIN
00300	STRING F ;
00400	PASS ; F ← E(NULL, "SOURCE!FILE") ;
00500	IF NOT EQU(THISWD[1 TO 6],"SOURCE") THEN
00600		WARN("=","REQUIRE -- SOURCE!FILE only!") ;
00650	IF NEXTS(FILE) THEN PASS ; TES 10/22/74 DWIM ;
00700	IF FULSTR(F) AND ON THEN SWICHF(F) ; PASS ;
00800	END "DREQUIRE" ;
     

00100	PUBLIC SIMPLE PROCEDURE GROWNESTS ;$"#
00200	BEGIN "GROWNESTS"
00300	GROW(INEST, INESTIDA, SIZE, 200, NULL) ; MAKEBE(INESTIDA, INEST) ;
00400	DUMMY ← 0 ; COMMENT OTHERWISE SPURIOUS MESSAGE FROM SGROW 2/28/73 TES ;
00500	SGROW(SNEST, SNESTIDA, DUMMY, 200, NULL) ; SMAKEBE(SNESTIDA, SNEST) ;
00600	ZEROSTRINGS(200, SNEST[SIZE-199]) ;
00700	END "GROWNESTS" ;
     

00100	PUBLIC STRING SIMPLE PROCEDURE RD(INTEGER BRKTBL) ;$"#
00200	BEGIN
00300	COMMENT INPUTSTR = [ [chars] LF line-no TB ]... [chars]
00400		All break tables should break on LF.
00500		RD's value is as if  LF line-no TB  were null. ;
00600	INTEGER PTR, BYTEWD ; STRING SPTR, RESULT, PART ;
00700	RESULT ← NULL ;
00800	DO BEGIN "PARTIAL"
00900	PART ← SCAN(INPUTSTR, BRKTBL, BRC) ;
01000	IF BRC = LF THEN
01100		BEGIN "MACRO LINE NUMBER"
01200		MACLINE ← SCAN(INPUTSTR, TO!TB!FF!SKIP, DUMMY) ;
01300		IF PART[∞ FOR 1] = LF THEN comment he Appended the break character ;
01400			PART ← IF DEFINING THEN PART & MACLINE & TB ELSE PART[1 TO ∞-1]
01500		ELSE IF DEFINING THEN PART ← PART & LF & MACLINE & TB ;
01600		END "MACRO LINE NUMBER"
01700	ELSE IF BRC = 0 THEN comment, ran out of input ;
01800		IF INPUTCHAN < 0 THEN INPUTSTR ← SWICHBACK comment, done scanning macro body ;
01900		ELSE	BEGIN "FROM FILE"
02000			DO	BEGIN comment, may be page marks or eof or more lines ;
02100				IF TECOFILE THEN
02200					BEGIN COMMENT CHECK FOR FF AND SUPERFLUOUS LFs ;
02300					SRCLINE ← CVS(CVD(SRCLINE)+1) ;
02400					INPUT(INPUTCHAN, NO!CHARS) ;
02500					WHILE BRC = LF DO
02600						BEGIN
02700						INPUT(INPUTCHAN,ONE!CHAR) ;
02800						INPUT(INPUTCHAN,NO!CHARS) ;
02900						END ;
03000					END
03100				ELSE SRCLINE ← INPUT(INPUTCHAN, TO!TB!FF!SKIP) ;
03200				IF BRC = FF THEN
03300				   BEGIN "PGMARK"
03400				   PAGEMARKS ← PAGEMARKS + 1 ;
03500				   IF TECOFILE THEN
03600					   BEGIN
03700					   INPUT(INPUTCHAN, ONE!CHAR) ;
03800					   SRCLINE ← "0" ;
03900					   END ;
04000				   WHILE INPGS AND LAST=4 AND BRC=FF AND PAGEMARKS>RH(INPG[INPGX]) DO
04100				      IF (INPGX←INPGX+1)>INPGS THEN BEGIN BRC←0 ; EOF←1 END
04200				      ELSE IF PAGEMARKS<(K←LH(INPG[INPGX])) THEN
04300					 DO	 BEGIN "SKIP PAGES"
04400						 DO INPUT(INPUTCHAN,TO!LF!TB!VT!SKIP)
04500							UNTIL BRC NEQ TB;
04600						 IF BRC = LF THEN
04700						 DO	BEGIN
04800							 SRCLINE←INPUT(INPUTCHAN,TO!TB!FF!SKIP);
04900							 IF BRC=FF THEN PAGEMARKS←PAGEMARKS+1 ;
05000							 END UNTIL BRC NEQ FF ;
05100						 END "SKIP PAGES"
05200					 UNTIL BRC NEQ TB OR PAGEMARKS GEQ K ;
05300				   IF  NOT EOF THEN
05400					BEGIN COMMENT COMPUTE AND DISPLAY PAGE NUMBER ;
05500					SRCPAGE ← CVS(PAGEMARKS) ;
05600					IF NOT PUBSTD THEN OUTSTR((
05700						IF SWDBACK THEN SPS(LAST-3)
05800						ELSE SP
05900							   )&SRCPAGE) ;
06000					SWDBACK ← 0 ;
06100					END ;
06200				   END "PGMARK" ;
06300				END
06400			UNTIL BRC NEQ FF ;
06500			MACLINE ← NULL ;
06600			IF EOF THEN INPUTSTR ← SWICHBACK comment, done scanning a SOURCE!FILE or gen-file;
06700			ELSE	BEGIN "FILE LINE"
06800				DO	BEGIN "EXPAND TABS"
06900					INPUTSTR ← INPUTSTR & INPUT(INPUTCHAN,TO!LF!TB!VT!SKIP) ;
07000					IF BRC=TB THEN INPUTSTR←INPUTSTR&
07100					   (IF PAGESCAN(LAST) GEQ 0 THEN
07200						IF TABTAB=0 THEN
07300						   SPS(8-LENGTH(INPUTSTR) MOD 8)
07400						ELSE TABTAB
07500					    ELSE TB)
07600					ELSE IF BRC=VT THEN
07700					 IF INPUTSTR[∞ FOR 1]=RCBRAK THEN INPUTSTR←INPUTSTR&VT
07800					 ELSE
07900					  BEGIN "GENVT" COMMENT MAYBE {PAGE!} IN GEN-FILE ;
08000					  SPTR ← INPUT(INPUTCHAN, TO!VT!SKIP) ;
08100					  IF (PTR ← CVD(SPTR)) GEQ TWO(14)
08200						AND LDB(PLIGHTWD(BYTEWD←ITBL[PTR-TWO(14)]))=2
08300						    THEN
08400							BEGIN
08500							BREAKSET(LOCAL!TABLE,ALTMODE,"IS");
08600							BREAKSET(LOCAL!TABLE,NULL,"O");
08700							S ← STBL[LDB(IXWD(BYTEWD))] ;
08800							INPUTSTR ← INPUTSTR[1 TO ∞-6] &
08900							SCAN(S,LOCAL!TABLE,DUMMY);
09000							END
09100					  ELSE INPUTSTR ← INPUTSTR & VT & SPTR & VT ;
09200					  END "GENVT"
09300					END "EXPAND TABS"
09400				UNTIL BRC = LF OR BRC < 0 OR EOF ;
09500				IF BRC LEQ 0 THEN
09600				   BEGIN BRC ← LF ;
09700				   IF  NOT EOF THEN
09800					WARN("=","Garbaged manuscript "&ERRLINE&"/"&SRCPAGE)
09900				   END ;
10000				IF DEFINING THEN PART ← PART & LF & SRCLINE & "/" & SRCPAGE & TB ;
10100				END "FILE LINE" ;
10200			END "FROM FILE" ;
10300	IF BRC = LF THEN
10400		IF DEFINING THEN BEGIN BRC←0 ; IF INPUTSTR=!COMMAND!CHARACTER! THEN
10500			BEGIN PART ← PART & TB ; LOPP(INPUTSTR) ; END END
10600		ELSE IF INPUTSTR = !COMMAND!CHARACTER!  OR  INPUTSTR = TB  THEN
10700			BEGIN
10800			LOPP(INPUTSTR) ;
10900			BRC ← 0 ; comment, keep scanning ;
11000			END
11100		ELSE INPUTSTR ← (BRC ← RCBRAK) & VT & INPUTSTR ;
11200	IF BRC THEN RETURN(IF LENGTH(RESULT)=0 THEN PART
11300			   ELSE IF LENGTH(PART)=0 THEN RESULT
11400			   ELSE RESULT & PART)
11500	ELSE IF LENGTH(RESULT)=0 THEN RESULT ← PART
11600	ELSE RESULT ← RESULT & PART ;
11700	END "PARTIAL"
11800	UNTIL FALSE ;
11900	END "RD" ;
     

00100	PUBLIC SIMPLE PROCEDURE SWICH(STRING NEWINPUTSTR; INTEGER NEWINPUTCHAN, ARGS) ;$"#
00200	BEGIN "SWICH" comment switch to new input stream ;
00300	IF ARGS THEN
00400		BEGIN "SUBSTITUTE"
00500		INTEGER BRC ; STRING NEWER ; NEWER ← NULL ; LAST ← LAST - ARGS ;
00600		DO	BEGIN "VTABS"
00700			NEWER ← NEWER & SCAN(NEWINPUTSTR, TO!VT!SKIP, BRC) ;
00800			IF BRC THEN NEWER ← NEWER & SNEST[LAST + LOP(NEWINPUTSTR)] ;
00900			END "VTABS"
01000		UNTIL BRC = 0 ;
01100		NEWINPUTSTR ← NEWER ;
01200		END "SUBSTITUTE" ;
01300	IF (LAST ← LAST+2) > SIZE THEN GROWNESTS ; 
01400	STRSCAN(LAST) ← IF THATISFULL THEN LIT!ENTITY & LIT!TRAIL & INPUTSTR ELSE INPUTSTR ;
01500	CHANSCAN(LAST) ← INPUTCHAN + (IF TECOFILE THEN 100 ELSE 0) ;
01600	LINESCAN(LAST) ← IF INPUTCHAN < 0 THEN MACLINE ELSE THISFILE & VT & SRCLINE ;
01700	PAGESCAN(LAST) ← LHRH(PAGEMARKS, PAGEWAS) ;
01800	EMPTYTHIS ; EMPTYTHAT ;
01900	INPUTSTR ← NEWINPUTSTR ; INPUTCHAN ← NEWINPUTCHAN ; TECOFILE ← 0 ;
02000	END "SWICH" ;
     

00100	PUBLIC STRING SIMPLE PROCEDURE SWICHBACK ;$"#
00200	BEGIN "SWICHBACK"
00300	EOF ← 0 ; IF INPUTCHAN GEQ 0 THEN 
00400	BEGIN 
00500	IF PUBSTD THEN PUBSTD ← FALSE
00600	ELSE IF SWFLG AND NOT SWDBACK THEN BEGIN OUTSTR("."&CRLF) ; SWDBACK←TRUE END ;
00700	RELEASE(INPUTCHAN) ;
00800	END
00900	ELSE IF CHANSCAN(LAST) LEQ -2 THEN RETURN(INPUTSTR←STRSCAN(LAST)) ;
01000	PAGEMARKS ← LH(DUMMY ← ABS(PAGESCAN(LAST))) ; PAGEWAS ← RH(DUMMY) ;
01100	SRCPAGE ← CVS(PAGEMARKS) ;
01200	IF (INPUTCHAN ← CHANSCAN(LAST))< 0 THEN MACLINE←LINESCAN(LAST)
01300	ELSE BEGIN SRCLINE←LINESCAN(LAST); 
01400	         THISFILE←SCAN(SRCLINE,TO!VT!SKIP,DUMMY) END ;
01500	IF TECOFILE ← INPUTCHAN > 50 THEN INPUTCHAN ← INPUTCHAN - 100 ;
01600	INPUTSTR ← STRSCAN(LAST) ; LAST←LAST-2;  REtURN(INPUTSTR) ;
01700	END "SWICHBACK" ;
     

00100	PUBLIC SIMPLE PROCEDURE SWICHF(STRING FILENAME) ;$"#
00200	BEGIN "SWICHF"
00300	TES 8/24/74 PROCEDURIZED AND ALLOWED DEFAULTS ;
00400	INTEGER CHAN ;
00500	CHAN ← OPENTOREAD(0, IF AGENFILE THEN "Generated File " ELSE "Source!file ", FILENAME, REQEXT, REQPPN) ;
00600	SWICHFILE(FILENAME, CHAN) ;
00700	END "SWICHF" ;
     

00100	PRIVATE SIMPLE PROCEDURE SWICHFILE(STRING FILENAME ; INTEGER CHAN) ;$"#
00200	BEGIN COMMENT FILE ALREADY OPEN ON CHAN ;
00300	TES 1/22/74 SUBROUTINIZED ; TES 3/23/74 SIMPLIFIED ;
00400	SWICH(NULL, CHAN, 0) ;
00500	IF AGENFILE THEN BEGIN TECOFILE←0 ; AGENFILE←FALSE END
00600	ELSE BEGIN INPUT(INPUTCHAN, NO!CHARS) ; TECOFILE ← BRC GEQ 0 END ;
00700	PAGEMARKS ← PAGEWAS ← 1 ; SRCPAGE ← "1" ; SRCLINE ← IF TECOFILE THEN "0" ELSE "00000" ;
00800	IFC SAILVER THENC
00900	IF TECOFILE THEN
01000		BEGIN COMMENT IF TVEDIT FILE, SKIP PAGE 1 ;
01100		IF EQU("COMMENT ⊗", INPUT(INPUTCHAN,TO!TERQ!CR)[1 TO 9]) THEN
01200			BEGIN
01300			DO INPUT(INPUTCHAN, TO!TB!FF!SKIP) UNTIL BRC=FF ;
01400			SRCPAGE ← "2" ; PAGEMARKS ← PAGEWAS ← 2 ;
01500			END
01600		ELSE BEGIN CLOSIN(INPUTCHAN) ; COMMENT NOT TVEDIT -- RESTART INPUT ;
01700				LOOKUP(CHAN,FILENAME,FLAG);
01800		END  END ;
01900	ENDC
02000	THISFILE ← FILENAME ;
02100	IF NOT PUBSTD THEN
02200	BEGIN
02300	IF LAST =4 AND SWFLG=0 THEN   TES ADDED SWFLG 12/5/73 ;
02400		BEGIN MAINFILE←THISFILE ; SWFLG ← 1 END
02500	ELSE BEGIN IF NOT SWDBACK THEN OUTSTR(CRLF) ; OUTSTR(SPS(LAST-4)) ; END ;
02600	OUTSTR(THISFILE&SP&SRCPAGE) ; SWDBACK ← FALSE ;
02700	END ;
02800	END "SWICHFILE" ;
     

00100	FINISHED
00200	
00300	ENDOF("SORCE")